package component

import (
	"fmt"
	"go.uber.org/zap"
)

var MsgLogger *msgLogger

func initMsgLog() {
	MsgLogger = newMsgLogger()
}

type msgLogger struct {
	msgChannel chan any
	logger     loggerI
}

func newMsgLogger() *msgLogger {
	logger := fileLogger{
		logger: NewLog("msg", "msgs"),
	}
	m := msgLogger{
		msgChannel: make(chan any, 1024),
		logger:     &logger,
	}
	go m.startWrite()
	return &m
}

func (o *msgLogger) AddMsg(msg any) {
	o.msgChannel <- msg
}

func (o *msgLogger) startWrite() {
	for msg := range o.msgChannel {
		fmt.Printf("%+v \n", msg)
		o.logger.writeLog(msg)
	}
}

type loggerI interface {
	writeLog(data any)
}

type fileLogger struct {
	logger *zap.Logger
}

func (o *fileLogger) writeLog(data any) {
	infoStr := ""
	switch info := data.(type) {
	case string:
		infoStr = info
	case []byte:
		infoStr = fmt.Sprintf("%x", info)
	default:
		bytes, _ := JsonEncode(info)
		infoStr = string(bytes)
	}

	fmt.Printf("%+v \n", infoStr)

	o.logger.Info(infoStr)
}
